自动求导

Note

求导是几乎所有深度学习优化算法的关键步骤,我们可以使用PyTorch自动求导。

一个简单的例子

假设我们想对函数 \(y = 2\mathbf{x}^{T}\mathbf{x}\) 关于列向量 \(\mathbf{x}\) 求导。

在pytorch中,tensor有一个requires_grad属性,默认为False,如果设置为True,那么反向传播时该tensor就会自动求导。

import torch

# 元素类型需为float
x = torch.arange(4.0, requires_grad=True)
x
tensor([0., 1., 2., 3.], requires_grad=True)
# y依赖于x,从而它的requires_grad同样为True
y = 2 * torch.dot(x, x)
y.requires_grad
True
# 自动求导
y.backward()
x.grad
tensor([ 0.,  4.,  8., 12.])

Warning

需要注意的是,梯度是会累加的!
所以我们一般会在每次backward前把梯度清0

# 梯度会累加
z = 3 * torch.dot(x, x)
z.backward()
x.grad
tensor([ 0., 10., 20., 30.])
# 梯度清0
x.grad.zero_()
x.grad
tensor([0., 0., 0., 0.])

torch.no_grad()

被torch.no_grad()包住的运算不会被计算梯度。

这在推断时很有用,可以节省内存。

a = torch.tensor([1.], requires_grad=True)

with torch.no_grad():
    b = a * 2

b.requires_grad
False